home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).zip / Franz PD Disk #334 (1994-06)(Rhein-Sieg-Soft).adf / ASo-Tools / Sources / Dir.asm < prev    next >
Assembly Source File  |  1993-07-11  |  16KB  |  953 lines

  1. ;mit DOBJ gewonnenes Listing von 'Dir'
  2. ;anschließend per Hand optimiert und dahingehend geändert, daß das H-Flag
  3. ;respektiert wird
  4.  
  5.     NOLIST
  6.     INCLUDE "exec/LVO.i"
  7.     INCLUDE "exec/execbase.i"
  8.     INCLUDE "exec/tasks.i"
  9.     INCLUDE "exec/memory.i"
  10.     INCLUDE "dos/LVO.i"
  11.     INCLUDE "dos/dos.i"
  12.     INCLUDE "dos/dosasl.i"
  13.     INCLUDE "dos/dosextens.i"
  14.     LIST
  15.  
  16.     SECTION only,CODE
  17.  
  18. main:    LINK.W    A5,#-776
  19.     MOVEM.L D2-D3/A2-A3/A6,-(sp)
  20.     MOVEA.W #_AbsExecBase,A0
  21.     MOVEA.L (A0),A3
  22.     MOVEA.L A3,A0
  23.     MOVE.L    A0,24(sp)
  24.     MOVE.W    #749,D0
  25.     MOVEQ    #0,D1
  26.     LEA.L    -758(A5),A1
  27. 1$:    MOVE.B    D1,(A1)+
  28.     dbf    D0,1$
  29.     MOVE.L    A3,-758(A5)
  30.     MOVEQ    #RETURN_FAIL,D0
  31.     MOVE.L    D0,-460(A5)
  32.     MOVE.L    D1,-464(A5)
  33.     LEA.L    DosName(pc),A1
  34.     MOVEQ    #36,D0
  35.     MOVEA.L A3,A6
  36.     CALL    OpenLibrary
  37.     MOVE.L    D0,A2
  38.     MOVE.L    D0,-754(A5)
  39.     beq    EndNoDos
  40.     MOVE.L    #$0800,D0
  41.     MOVE.L    #MEMF_CLEAR|MEMF_PUBLIC,D1
  42.     CALL    AllocVec
  43.     MOVE.L    D0,-432(A5)
  44.     bne    2$
  45.     MOVEA.L A2,A6
  46.     CALL    IoErr
  47.     MOVE.L    D0,-464(A5)
  48.     bra    EndNoMem
  49. 2$:    LEA.L    Template(pc),A0
  50.     MOVE.L    A0,D1
  51.     LEA.L    -456(A5),A1
  52.     MOVE.L    A1,D2
  53.     MOVEQ    #0,D3
  54.     MOVEA.L A2,A6
  55.     CALL    ReadArgs
  56.     MOVE.L    D0,20(sp)
  57.     bne    3$
  58.     CALL    IoErr
  59.     MOVE.L    D0,-464(A5)
  60.     bra    EndBadArgs
  61. 3$:    MOVE.L    -452(A5),D1
  62.     beq    EvaluateOptions
  63.     MOVEA.L D1,A3
  64.     bra    NextOpt
  65. ParseOpts:
  66.     moveq    #1,d1
  67.     MOVE.B    (A3)+,D0
  68.     SUBI.b    #'A',D0         ;'A' ?
  69.     beq    3$
  70.     SUBQ.b    #3,D0        ;'D' ?
  71.     beq    4$
  72.     SUBQ.b    #2,D0        ;'F' ?
  73.     beq    5$
  74.     SUBQ.b    #3,D0        ;'I' ?
  75.     beq    6$
  76.     SUBI.b    #24,D0        ;'a' ?
  77.     beq    3$
  78.     SUBQ.b    #3,D0        ;'d' ?
  79.     beq    4$
  80.     SUBQ.b    #2,D0        ;'f' ?
  81.     beq    5$
  82.     SUBQ.b    #3,D0        ;'i' ?
  83.     bne    7$
  84. 6$:    MOVE.L    D1,-436(A5)
  85.     bra    NextOpt
  86. 3$:    MOVE.L    D1,-448(A5)
  87.     bra    NextOpt
  88. 4$:    MOVE.L    D1,-444(A5)
  89.     bra    NextOpt
  90. 5$:    MOVE.L    D1,-440(A5)
  91.     bra    NextOpt
  92. 7$:    MOVEA.L A2,A6
  93.     CALL    Output
  94.     MOVEQ    #0,D1
  95.     MOVE.B    -1(A3),D1
  96.     MOVE.L    D1,32(sp)
  97.     move.l    d1,d2
  98.     MOVE.L    D0,D1
  99.     CALL    FPutC
  100.     LEA.L    IgnoreOptTxt(pc),A0
  101.     MOVE.L    A0,D1
  102.     CALL    PutStr
  103. NextOpt:
  104.     TST.B    (A3)
  105.     bne    ParseOpts
  106. EvaluateOptions:
  107.     lea    -465(a5),a0
  108.     TST.L    -448(A5)
  109.     beq    1$
  110.     BSET.B    #0,(a0)
  111. 1$:    TST.L    -436(A5)
  112.     beq    2$
  113.     BSET.B    #3,(a0)
  114. 2$:    MOVE.L    -440(A5),D0
  115.     beq    3$
  116.     BSET.B    #2,(a0)
  117. 3$:    MOVE.L    -444(A5),D1
  118.     beq    4$
  119.     BSET.B    #1,(a0)
  120. 4$:    or.l    d1,d0
  121.     bne    5$
  122.     OR.B    #6,(a0)
  123. 5$:    MOVE.L    #$1000,-742(A5)
  124.     MOVE.B    #1,-734(A5)
  125.     TST.L    -456(A5)
  126.     bne    6$
  127.     LEA.L    L11(pc),A0
  128.     MOVE.L    A0,-456(A5)
  129. 6$:    MOVEA.L -456(A5),A0
  130.     MOVE.L    A0,D1
  131.     LEA.L    -750(A5),A1
  132.     MOVE.L    A1,D2
  133.     MOVEA.L A2,A6
  134.     CALL    MatchFirst
  135.     TST.L    D0
  136.     beq    L9
  137.     CALL    IoErr
  138.     MOVE.L    D0,-464(A5)
  139.     CMPI.L    #ERROR_BREAK,D0
  140.     beq    L10
  141.     MOVE.B    -734(A5),D0
  142.     BTST.L    #1,D0
  143.     bne    L10
  144.     LEA.L    NoInfoTxt(pc),A0
  145.     MOVE.L    A0,D1
  146.     LEA.L    -456(A5),A1
  147.     MOVE.L    A1,D2
  148.     CALL    VPrintf
  149.     bra    L10
  150. L9:    tst.l  -726(A5)
  151.     bpl    L12
  152.     btst.b    #1,-734(a5)
  153.     bne    L12
  154.     MOVE.L    #ERROR_DIR_NOT_FOUND,-464(A5)
  155.     LEA.L    NoDirTxt(pc),A1
  156.     MOVE.L    A1,D1
  157.     LEA.L    -456(A5),A0
  158.     MOVE.L    A0,D2
  159.     CALL    VPrintf
  160.     bra    L10
  161. L12:    bclr.b    #3,-734(a5)
  162.     MOVEQ    #0,D0
  163.     LEA.L    -758(A5),A0
  164.     move.l    d0,a1
  165.     bsr    DoDir
  166. L10:    LEA.L    -750(A5),A0
  167.     MOVE.L    A0,D1
  168.     MOVEA.L A2,A6
  169.     CALL    MatchEnd
  170.     MOVE.L    20(sp),D1
  171.     CALL    FreeArgs
  172. EndBadArgs:
  173.     MOVEA.L 24(sp),A3
  174.     MOVEA.L -432(A5),A1
  175.     MOVEA.L A3,A6
  176.     CALL    FreeVec
  177. EndNoMem:
  178.     MOVE.L    -464(A5),D1
  179.     beq    2$
  180.     CMPI.L    #ERROR_BREAK,D1
  181.     beq    1$
  182.     MOVEA.L A2,A6
  183.     CALL    SetIoErr
  184. 1$:    MOVE.L    -464(A5),D1
  185.     MOVEQ    #ERROR_NO_MORE_ENTRIES/2,D0
  186.     ADD.L    D0,D0
  187.     CMP.L    D1,D0
  188.     beq    2$
  189.     MOVEQ    #0,D2
  190.     MOVEA.L A2,A6
  191.     CALL    PrintFault
  192. 2$:    MOVEA.L A2,A1
  193.     MOVEA.L A3,A6
  194.     CALL    CloseLibrary
  195.     bra    Exit
  196. EndNoDos:
  197.     move.l    (a3),a1
  198.     MOVEA.L ThisTask(A1),A0
  199.     MOVEQ    #ERROR_INVALID_RESIDENT_LIBRARY,D0
  200.     MOVE.L    D0,pr_Result2(A0)
  201. Exit:    MOVE.L    -460(A5),D0
  202.     MOVEM.L (sp)+,D2-D3/A2-A3/A6
  203.     UNLK    A5
  204.     RTS
  205.  
  206. DoDir:    LINK.W    A5,#-36
  207.     MOVEM.L D2-D7/A2-A3/A6,-(sp)
  208.     MOVE.L    D0,D7
  209.     MOVEA.L A1,A3
  210.     MOVE.L    A0,-32(A5)
  211.     SUBA.L    A0,A0
  212.     MOVE.L    A0,-20(A5)
  213.     MOVE.L    A0,D6
  214.     MOVEA.L -32(A5),A2
  215.     MOVEQ    #20,D0
  216.     MOVE.L    D0,298(A2)
  217.     MOVE.L    A0,D5
  218.     MOVE.L    A3,-28(A5)
  219.     BCLR.B    #5,293(A2)
  220.     tst.l    32(A2)          ;ap_Info+fib_DirEntryType+8
  221.     ble    L16
  222.     TST.L    D7
  223.     bne    1$
  224.     BTST.B    #1,24(A2)       ;ap_Flags+8
  225.     bne    L16
  226. 1$:    BSET.B    #2,24(A2)       ;ap_Flags+8
  227.     LEA.L    8(A2),A0
  228.     MOVE.L    A0,D1
  229.     MOVEA.L 4(A2),A6
  230.     CALL    MatchNext
  231.     MOVE.L    D0,D5
  232. L16:    BTST.B    #4,22(A2)       ;ap_FoundBreak+2+8
  233.     beq    1$
  234.     MOVE.L    #ERROR_BREAK,D5
  235.     MOVEQ    #64,D0
  236.     MOVE.L    D0,290(A2)
  237. 1$:    TST.L    D5
  238.     bne    L19        ;bne L21 ?
  239.     MOVEA.L 12(A2),A0
  240.     MOVE.L    8(A0),D1
  241.     MOVEA.L 4(A2),A6
  242.     CALL    DupLock
  243.     MOVE.L    D0,D6
  244.     MOVE.L    D6,-24(A5)
  245.     MOVEA.L A3,A0
  246.     MOVE.L    A0,-28(A5)
  247.     MOVE.L    A0,746(A2)
  248.     bra    L18
  249. L17:    MOVEA.L 746(A2),A0
  250.     MOVE.L    4(A0),D1
  251.     MOVE.L    D6,D2
  252.     MOVEA.L 4(A2),A6
  253.     CALL    SameLock
  254.     TST.L    D0
  255.     bne    1$
  256.     BTST.B    #3,24(A2)
  257.     bne    1$
  258.     LEA.L    CircularDirTxt(pc),A1
  259.     MOVE.L    A1,D1
  260.     CALL    PutStr
  261.     bra    L20
  262. 1$:    MOVEA.L -32(A5),A2
  263.     MOVEA.L 746(A2),A0
  264.     MOVE.L    (A0),746(A2)
  265. L18:    TST.L    746(A2)
  266.     bne    L17
  267.     bra    L19
  268. L38:    BTST.B    #3,24(A2)       ;ap_Flags+8
  269.     beq    1$
  270.     BCLR.B    #3,24(A2)       ;ap_Flags+8
  271.     MOVEQ    #ERROR_NO_MORE_ENTRIES/2,D5
  272.     ADD.L    D5,D5
  273.     bra    L21
  274.  
  275. ;dieser Einschub soll dafür sorgen, daß das Hidden-Flag respektiert wird:
  276. 1$:    btst.b    #7,147(a2)      ;ap_Info+fib_Protection+3+8
  277.     bne    L32
  278.     ;Es geht im Moment darum, hier das richtige Sprungziel zu finden.
  279.     ;* bei L21 wird das aktuelle Directory als abgearbeitet betrachtet.
  280.     ;* bei L19 bleibt das Programm in irgendeiner Schleife hängen
  281.     ;    (vermutlich wird MatchNext übergangen)
  282.     ;* L32 scheint zu stimmen ! (auch kurz mit OPT I/A getestet)
  283.  
  284. 3$:    MOVEA.L -32(A5),A2
  285.     BTST.B    #4,22(A2)       ;ap_FoundBreak+2+8
  286.     beq    2$
  287.     MOVE.L    #ERROR_BREAK,D5
  288.     MOVEQ    #64,D0
  289.     MOVE.L    D0,290(A2)
  290.     bra    L21
  291. 2$:    MOVEA.L -32(A5),A2
  292.     BTST.B    #1,293(A2)
  293.     beq    L22
  294.     tst.l    32(A2)          ;ap_Info+fib_DirEntryType+8
  295.     ble    L22
  296.     MOVEA.L A2,A0
  297.     LEA.L    330(A0),A3
  298.     ADDA.W    #36,A2
  299.     BTST.B    #1,24(A0)
  300.     beq    L23
  301.     TST.L    D7
  302.     bne    L23
  303.     MOVEA.L -32(A5),A1
  304.     MOVEA.L 12(A1),A0       ;ap_Last+8
  305.     MOVE.L    8(A0),D1
  306.     MOVE.L    A3,D2
  307.     MOVEQ    #64,D3
  308.     ADD.L    D3,D3
  309.     MOVEA.L 4(A1),A6
  310.     CALL    NameFromLock
  311.     MOVE.L    D2,D1
  312.     MOVE.L    A2,D2
  313.     CALL    AddPart
  314.     bra    L24
  315. L23:    MOVEQ    #64,D0
  316.     ADD.L    D0,D0
  317.     MOVEA.L A3,A0
  318.     MOVEA.L A2,A1
  319.     bsr    strncpy
  320. L24:    MOVEA.L -32(A5),A2
  321.     MOVE.L    D7,D0
  322.     ADDQ.L    #1,D0
  323.     MOVE.L    D0,D1
  324.     LSL.L    #2,D1
  325.     ADD.L    D0,D1
  326.     MOVE.L    D1,714(A2)
  327.     MOVE.L    A3,718(A2)
  328.     MOVEQ    #ST_LINKDIR,D0
  329.     CMP.L    32(A2),D0       ;ap_Info+fib_DirEntryType+8
  330.     bne    1$
  331.     LEA.L    DirHlTxt(pc),A0
  332.     bra    3$
  333. 1$:    LEA.L    DirTxt(pc),A0
  334. 3$:    MOVE.L    A0,722(A2)
  335.     LEA.L    714(A2),A3
  336.     MOVE.L    A3,-(sp)
  337.     MOVEA.L 326(A2),A0
  338.     LEA.L    MetaFormat(pc),A1
  339.     bsr    sprintf
  340.     ADDQ.W    #4,A7
  341.     LEA.L    SpcTxt(pc),A0
  342.     MOVE.L    A0,714(A2)
  343.     BTST.B    #3,293(A2)
  344.     beq    L27
  345.     BSET.B    #7,293(A2)
  346. L29:    MOVE.L    326(A2),D1
  347.     MOVE.L    A3,D2
  348.     MOVEA.L 4(A2),A6
  349.     CALL    VPrintf
  350.     LEA.L    QMarkTxt(pc),A0
  351.     MOVE.L    A0,D1
  352.     MOVEQ    #0,D2
  353.     CALL    VPrintf
  354.     MOVEQ    #0,D0
  355.     MOVE.L    D0,D1
  356.     MOVEA.L A2,A0
  357.     bsr    Interact
  358. L28:    BTST.B    #7,293(A2)
  359.     bne    L29
  360.     BTST.B    #4,293(A2)
  361.     beq    1$
  362.     BCLR.B    #4,293(A2)
  363.     bra    L21
  364. 1$:    MOVEA.L -32(A5),A2
  365.     BTST.B    #6,293(A2)
  366.     bne    L20
  367.     MOVEQ    #20,D0
  368.     CMP.L    298(A2),D0
  369.     bne    L22
  370.     bra    L20
  371. L27:    MOVE.L    326(A2),D1
  372.     MOVE.L    A3,D2
  373.     MOVEA.L 4(A2),A6
  374.     CALL    VPrintf
  375.     LEA.L    LfTxt(pc),A0
  376.     MOVE.L    A0,D1
  377.     CALL    PutStr
  378. L22:    MOVEA.L -32(A5),A2
  379.     MOVEQ    #33,D0
  380.     AND.L    290(A2),D0
  381.     beq    L31
  382.     tst.l    32(A2)          ;ap_Info+fib_DirEntryType+8
  383.     bmi    L31
  384.     MOVE.L    D7,D0
  385.     ADDQ.L    #1,D0
  386.     MOVEA.L A2,A0
  387.     LEA.L    -28(A5),A1
  388.     bsr    DoDir
  389.     BCLR.B    #3,24(A2)       ;ap_Flags+8
  390.     BTST.B    #6,293(A2)
  391.     bne    L20
  392.     MOVEQ    #20,D0
  393.     CMP.L    298(A2),D0
  394.     beq    L20
  395. L31:    MOVEA.L -32(A5),A2
  396.     BTST.B    #2,293(A2)
  397.     beq    L32
  398.     tst.l    32(A2)          ;ap_Info+fib_DirEntryType+8
  399.     bpl    L32
  400.     MOVEQ    #40,D0
  401.     MOVE.L    #MEMF_CLEAR|MEMF_PUBLIC,D1
  402.     MOVEA.L (A2),A6
  403.     CALL    AllocVec
  404.     MOVE.L    D0,734(A2)
  405.     bne    L33
  406.     MOVEA.L 4(A2),A6
  407.     CALL    IoErr
  408.     MOVE.L    D0,294(A2)
  409.     LEA.L    IncompleteTxt(pc),A0
  410.     MOVE.L    A0,D1
  411.     MOVEA.L 4(A2),A6
  412.     CALL    PutStr
  413.     bra    L21
  414. L33:    MOVEA.L -32(A5),A2
  415.     MOVEA.L 734(A2),A0
  416.     ADDQ.L    #8,A0
  417.     LEA.L    36(A2),A1
  418.     MOVEQ    #32,D0
  419.     bsr    strncpy
  420.     MOVEA.L 734(A2),A0
  421.     MOVE.L    32(A2),4(A0)
  422.     LEA.L    -20(A5),A0
  423.     MOVE.L    A0,742(A2)
  424.     MOVE.L    -20(A5),738(A2)
  425.     bra    L34
  426. L37:    MOVEA.L 738(A2),A0
  427.     ADDQ.L    #8,A0
  428.     MOVEA.L 734(A2),A1
  429.     ADDQ.L    #8,A1
  430.     bsr    stricmp
  431.     TST.L    D0
  432.     ble    1$
  433.     MOVEA.L 734(A2),A0
  434.     MOVEA.L 742(A2),A1
  435.     MOVE.L    (A1),(A0)
  436.     MOVEA.L 742(A2),A0
  437.     MOVE.L    734(A2),(A0)
  438.     bra    L36
  439. 1$:    MOVEA.L -32(A5),A2
  440.     MOVEA.L 738(A2),A0
  441.     MOVE.L    A0,742(A2)
  442.     MOVE.L    (A0),738(A2)
  443. L34:    TST.L    738(A2)
  444.     bne    L37
  445. L36:    TST.L    738(A2)
  446.     bne    L32
  447.     MOVEA.L 742(A2),A0
  448.     MOVE.L    734(A2),(A0)
  449. L32:    LEA.L    8(A2),A0
  450.     MOVE.L    A0,D1
  451.     MOVEA.L 4(A2),A6
  452.     CALL    MatchNext
  453.     MOVE.L    D0,D5
  454.     BTST.B    #0,292(A2)
  455.     beq    L19
  456.     MOVE.L    D6,D1
  457.     CALL    CurrentDir
  458.     MOVE.L    D0,D4
  459.     LEA.L    330(A2),A0
  460.     MOVE.L    A0,D1
  461.     CALL    DeleteFile
  462.     TST.L    D0
  463.     bne    1$
  464.     CALL    IoErr
  465.     MOVE.L    D0,D1
  466.     MOVEQ    #0,D2
  467.     CALL    PrintFault
  468.     bra    2$
  469. 1$:    LEA.L    DelTxt(pc),A0
  470.     MOVE.L    A0,D1
  471.     CALL    PutStr
  472. 2$:    MOVE.L    D4,D1
  473.     CALL    CurrentDir
  474.     BCLR.B    #0,292(A2)
  475. L19:    TST.L    D5
  476.     beq    L38
  477. L21:    CMPI.L    #ERROR_BREAK,D5
  478.     bne    1$
  479.     MOVE.L    d5,294(A2)
  480.     MOVEQ    #5,D0
  481.     MOVE.L    D0,298(A2)
  482.     MOVEQ    #64,D0
  483.     MOVE.L    D0,290(A2)
  484.     bra    L20
  485. 1$:    MOVEA.L -32(A5),A2
  486.     BTST.B    #6,293(A2)
  487.     bne    L20
  488.     MOVEA.L -32(A5),A2
  489.     MOVEQ    #ERROR_NO_MORE_ENTRIES/2,D0
  490.     ADD.L    D0,D0
  491.     CMP.L    D0,D5
  492.     beq    2$
  493.     MOVEA.L 4(A2),A6
  494.     CALL    IoErr
  495.     MOVE.L    D0,294(A2)
  496. 2$:    MOVEQ    #0,D0
  497.     MOVE.L    D0,298(A2)
  498.     MOVE.L    -20(A5),734(A2)
  499.     MOVE.L    D0,722(A2)
  500.     MOVEQ    #1,D5
  501.     bra    L39
  502. L45:    BTST.B    #3,293(A2)
  503.     beq    L40
  504.     MOVE.L    D7,D0
  505.     LSL.L    #2,D0
  506.     ADD.L    D7,D0
  507.     ADDQ.L    #2,D0
  508.     MOVE.L    D0,714(A2)
  509.     MOVEA.L 734(A2),A3
  510.     LEA.L    8(A3),A0
  511.     MOVE.L    A0,718(A2)
  512.     LEA.L    L11(pc),A0
  513.     MOVE.L    A0,722(A2)
  514.     MOVE.L    4(A3),D0
  515.     addq.l    #4,d0
  516.     bne    3$
  517.     LEA.L    HlTxt(pc),A0
  518.     MOVE.L    A0,722(A2)
  519. 3$:    MOVEQ    #3,D0
  520.     CMP.L    4(A3),D0
  521.     bne    4$
  522.     LEA.L    SlTxt(pc),A0
  523.     MOVE.L    A0,722(A2)
  524. 4$:    LEA.L    714(A2),A3
  525.     MOVE.L    A3,-(sp)
  526.     MOVEA.L 326(A2),A0
  527.     LEA.L    MetaFormat2(pc),A1
  528.     bsr    sprintf
  529.     LEA.L    SpcTxt(pc),A0
  530.     MOVE.L    A0,714(A2)
  531.     BSET.B    #7,293(A2)
  532.     LEA.L    330(A2),A0
  533.     MOVEA.L 734(A2),A1
  534.     ADDQ.L    #8,A1
  535.     MOVEQ    #64,D0
  536.     ADD.L    D0,D0
  537.     bsr    strncpy
  538.     ADDQ.W    #4,sp
  539.     bra    L41
  540. L42:    MOVE.L    326(A2),D1
  541.     MOVE.L    A3,D2
  542.     MOVEA.L 4(A2),A6
  543.     CALL    VPrintf
  544.     LEA.L    QMarkTxt(pc),A0
  545.     MOVE.L    A0,D1
  546.     MOVEQ    #0,D2
  547.     CALL    VPrintf
  548.     MOVE.L    D6,D0
  549.     MOVEQ    #1,D1
  550.     MOVEA.L A2,A0
  551.     bsr    Interact
  552. L41:    BTST.B    #7,293(A2)
  553.     bne    L42
  554.     BTST.B    #4,293(A2)
  555.     beq    1$
  556.     BCLR.B    #4,293(A2)
  557.     bra    L20
  558. 1$:    MOVEA.L -32(A5),A2
  559.     BTST.B    #6,293(A2)
  560.     beq    L43
  561.     bra    L20
  562. L40:    MOVE.L    #SIGBREAKF_CTRL_C,D1
  563.     MOVEA.L 4(A2),A6
  564.     CALL    CheckSignal
  565.     TST.L    D0
  566.     beq    1$
  567.     MOVEQ    #64,D0
  568.     MOVE.L    D0,290(A2)
  569.     MOVEQ    #5,D0
  570.     MOVE.L    D0,298(A2)
  571.     MOVE.L    #ERROR_BREAK,294(A2)
  572.     bra    L20
  573. 1$:    MOVEA.L -32(A5),A2
  574.     MOVE.L    D5,D0
  575.     MOVEQ    #1,D1
  576.     AND.L    D1,D0
  577.     ASL.L    #7,D0
  578.     MOVEA.L A2,A0
  579.     ADDA.L    D0,A0
  580.     LEA.L    458(A0),A3
  581.     MOVEA.L 734(A2),A0
  582.     ADDQ.L    #8,A0
  583.     MOVEA.L A0,A1
  584.     MOVEQ    #32,D0
  585.     MOVEA.L A3,A0
  586.     bsr    strncpy
  587.     MOVEA.L 734(A2),A0
  588.     MOVEQ    #-4,D0
  589.     CMP.L    4(A0),D0
  590.     bne    2$
  591.     MOVEA.L A3,A0
  592.     LEA.L    HlTxt(pc),A1
  593.     bsr    strcat
  594. 2$:    MOVEA.L 734(A2),A0
  595.     MOVEQ    #3,D0
  596.     CMP.L    4(A0),D0
  597.     bne    3$
  598.     MOVEA.L A3,A0
  599.     LEA.L    SlTxt(pc),A1
  600.     bsr    strcat
  601. 3$:    MOVE.L    D5,D0
  602.     ASL.L    #2,D0
  603.     MOVE.L    D0,D1
  604.     ADDI.L    #714,D1
  605.     MOVE.L    A3,0(A2,D1.L)
  606.     MOVEQ    #3,D0
  607.     SUB.L    D5,D0
  608.     MOVE.L    D0,D5
  609.     MOVEQ    #1,D0
  610.     CMP.L    D0,D5
  611.     beq    4$
  612.     MOVEA.L 734(A2),A0
  613.     TST.L    (A0)
  614.     bne    L43
  615. 4$:    MOVE.L    D7,D0
  616.     LSL.L    #2,D0
  617.     ADD.L    D7,D0
  618.     ADDQ.L    #2,D0
  619.     lea    714(a2),a0
  620.     move.l    d0,(a0)
  621.     MOVE.L    A0,-(sp)
  622.     MOVE.L    A0,40(sp)
  623.     MOVEA.L 326(A2),A0
  624.     LEA.L    MetaFormat3(pc),A1
  625.     bsr    sprintf
  626.     ADDQ.W    #4,sp
  627.     LEA.L    SpcTxt(pc),A0
  628.     MOVE.L    A0,714(A2)
  629.     MOVE.L    326(A2),D1
  630.     MOVE.L    36(sp),D2
  631.     MOVEA.L 4(A2),A6
  632.     CALL    VPrintf
  633.     CLR.L    722(A2)
  634. L43:    MOVEA.L -32(A5),A2
  635.     MOVEA.L 734(A2),A0
  636.     MOVE.L    (A0),734(A2)
  637. L39:    TST.L    734(A2)
  638.     beq    L20
  639.     TST.L    298(A2)
  640.     beq    L45
  641.     bra    L20
  642. L46:    MOVEA.L -20(A5),A1
  643.     MOVE.L    (A1),734(A2)
  644.     MOVEA.L (A2),A6
  645.     CALl    FreeVec
  646.     MOVE.L    734(A2),-20(A5)
  647. L20:    TST.L    -20(A5)
  648.     bne    L46
  649.     TST.L    D6
  650.     beq    1$
  651.     MOVE.L    D6,D1
  652.     MOVEA.L 4(A2),A6
  653.     CALL    UnLock
  654. 1$:    MOVEM.L (sp)+,D2-D7/A2-A3/A6
  655.     UNLK    A5
  656.     RTS
  657.  
  658. Interact:
  659.     LINK.W    A5,#-36
  660.     MOVEM.L D2-D3/D6-D7/A2-A3/A6,-(sp)
  661.     MOVEA.L A0,A3
  662.     MOVE.L    D0,D7
  663.     MOVE.L    D1,D6
  664.     MOVEQ    #0,D0
  665.     MOVE.L    D0,298(A3)
  666.     BSET.B    #7,293(A3)
  667.     MOVEQ    #23,D0
  668.     MOVEQ    #0,D1
  669.     LEA.L    -28(A5),A0
  670. 1$:    MOVE.B    D1,(A0)+
  671.     dbf    D0,1$
  672.     MOVEA.L 4(A3),A6
  673.     CALL    Output
  674.     MOVE.L    D0,D1
  675.     CALL    Flush
  676.     MOVEQ    #64,D0
  677.     ADD.L    D0,D0
  678.     MOVE.L    #MEMF_CLEAR|MEMF_PUBLIC,D1
  679.     MOVEA.L (A3),A6
  680.     CALL    AllocVec
  681.     MOVE.L    D0,28(sp)
  682.     bne    L47
  683.     MOVEA.L 4(A3),A6
  684.     CALL    IoErr
  685.     MOVE.L    D0,294(A3)
  686.     LEA.L    IncompleteTxt(pc),A0
  687.     MOVE.L    A0,D1
  688.     MOVEA.L 4(A3),A6
  689.     CALL    PutStr
  690.     MOVEQ    #20,D0
  691.     MOVE.L    D0,298(A3)
  692.     bra    L48
  693. L47:    TST.L    D6
  694.     bne    1$
  695.     LEA.L    InteractionTemplate1(pc),A0
  696.     MOVE.L    A0,D1
  697.     LEA.L    -28(A5),A1
  698.     MOVE.L    A1,D2
  699.     MOVEQ    #0,D3
  700.     MOVEA.L 4(A3),A6
  701.     CALL    ReadArgs
  702.     MOVEA.L D0,A2
  703.     bra    2$
  704. 1$:    LEA.L    InteractionTemplate2(pc),A0
  705.     MOVE.L    A0,D1
  706.     LEA.L    -28(A5),A1
  707.     MOVE.L    A1,D2
  708.     MOVEQ    #0,D3
  709.     MOVEA.L 4(A3),A6
  710.     CALL    ReadArgs
  711.     MOVEA.L D0,A2
  712. 2$:    MOVE.L    A2,D0
  713.     bne    3$
  714.     CALL    IoErr
  715.     MOVE.L    D0,294(A3)
  716.     MOVEQ    #20,D0
  717.     MOVE.L    D0,298(A3)
  718.     bra    L49
  719. 3$:    TST.L    -28(A5)
  720.     beq    L50
  721.     MOVEQ    #1,D0
  722.     CMP.L    D0,D6
  723.     bne    L50
  724.     MOVE.L    D7,D1
  725.     CALL    CurrentDir
  726.     MOVE.L    D0,D6
  727.     LEA.L    330(A3),A0
  728.     MOVE.L    A0,D1
  729.     MOVE.L    #MODE_OLDFILE,D2
  730.     CALL    Open
  731.     MOVE.L    D0,D7
  732.     bne    L51
  733.     CALL    IoErr
  734.     MOVE.L    D0,294(A3)
  735.     MOVEQ    #20,D0
  736.     MOVE.L    D0,298(A3)
  737.     bra    L52
  738. L54:    move.l    #SIGBREAKF_CTRL_C,D1
  739.     MOVEA.L 4(A3),A6
  740.     CALL    CheckSignal
  741.     TST.L    D0
  742.     beq    1$
  743.     MOVE.L    #ERROR_BREAK,D1
  744.     MOVEQ    #0,D2
  745.     CALL    PrintFault
  746.     bra    L53
  747. 1$:    LEA.L    -29(A5),A0
  748.     MOVE.L    A0,D1
  749.     MOVEQ    #1,D2
  750.     CALL    WriteChars
  751. L51:    MOVE.L    D7,D1
  752.     MOVEA.L 4(A3),A6
  753.     CALL    FGetC
  754.     MOVE.B    D0,-29(A5)
  755.     CMPI.B    #$ff,D0
  756.     bne    L54
  757. L53:    MOVE.L    D7,D1
  758.     MOVEA.L 4(A3),A6
  759.     CALL    Close
  760. L52:    MOVE.L    D6,D1
  761.     MOVEA.L 4(A3),A6
  762.     CALL    CurrentDir
  763.     bra    L55
  764. L50:    TST.L    -12(A5)
  765.     beq    L56
  766.     MOVE.L    -8(A5),D1
  767.     beq    L57
  768.     MOVEQ    #0,D2
  769.     MOVE.L    D2,D3
  770.     MOVEA.L 4(A3),A6
  771.     CALL    Execute
  772.     LEA.L    LfTxt(pc),A0
  773.     MOVE.L    A0,D1
  774.     CALL    PutStr
  775.     bra    L55
  776. L57:    LEA.L    CmdQuest(pc),A0
  777.     MOVE.L    A0,D1
  778.     MOVEA.L 4(A3),A6
  779.     CALL    PutStr
  780.     CALL    Output
  781.     MOVE.L    D0,D1
  782.     CALL    Flush
  783.     CALL     Input
  784.     MOVE.L    D0,D1
  785.     MOVE.L    28(sp),D2
  786.     MOVE.L    #$0800,D3
  787.     CALL    FGets
  788.     TST.L    D0
  789.     beq    L55
  790.     MOVE.L    D2,D1
  791.     MOVEQ    #0,D2
  792.     MOVE.L    D2,D3
  793.     CALL    Execute
  794.     LEA.L    LfTxt(pc),A0
  795.     MOVE.L    A0,D1
  796.     CALL    PutStr
  797.     bra    L55
  798. L56:    TST.L    -8(A5)
  799.     beq    1$
  800.     LEA.L    InvalidAnswerTxt(pc),A0
  801.     MOVE.L    A0,D1
  802.     MOVEA.L 4(A3),A6
  803.     CALL    PutStr
  804.     bra    L55
  805. 1$:    TST.L    -16(A5)
  806.     beq    2$
  807.     MOVEQ    #64,D0
  808.     MOVE.L    D0,290(A3)
  809.     bra    L58
  810. 2$:    TST.L    -24(A5)
  811.     beq    3$
  812.     BSET.B    #3,24(A3)
  813.     BSET.B    #4,293(A3)
  814.     bra    L58
  815. 3$:    TST.L    -28(A5)
  816.     beq    4$
  817.     TST.L    D6
  818.     bne    4$
  819.     BSET.B    #5,293(A3)
  820.     bra    L58
  821. 4$:    TST.L    -20(A5)
  822.     beq    L58
  823.     MOVEQ    #1,D0
  824.     CMP.L    D0,D6
  825.     bne    L59
  826.     MOVE.L    D7,D1
  827.     MOVEA.L 4(A3),A6
  828.     CALL    CurrentDir
  829.     MOVE.L    D0,D6
  830.     LEA.L    330(A3),A0
  831.     MOVE.L    A0,D1
  832.     CALL    DeleteFile
  833.     TST.L    D0
  834.     bne    5$
  835.     CALL    IoErr
  836.     MOVE.L    D0,294(A3)
  837.     MOVEQ    #10,D0
  838.     MOVE.L    D0,298(A3)
  839.     bra    6$
  840. 5$:    LEA.L    DelTxt(pc),A0
  841.     MOVE.L    A0,D1
  842.     CALL    PutStr
  843. 6$:    MOVE.L    D6,D1
  844.     MOVEA.L 4(A3),A6
  845.     CALL    CurrentDir
  846.     bra    L58
  847. L59:    BSET.B    #0,292(A3)
  848. L58:    BCLR.B    #7,293(A3)
  849. L55:    MOVE.L    A2,D1
  850.     MOVEA.L 4(A3),A6
  851.     CALL    FreeArgs
  852. L49:    MOVEA.L 28(sp),A1
  853.     MOVEA.L (A3),A6
  854.     CALL    FreeVec
  855. L48:    MOVEM.L (sp)+,D2-D3/D6-D7/A2-A3/A6
  856.     UNLK    A5
  857.     RTS
  858.  
  859. putc:    MOVE.B    D0,(A3)+
  860.     RTS
  861.  
  862. sprintf:
  863.     MOVEM.L A2-A3/A6,-(sp)
  864.     MOVEA.L A0,A3
  865.     move.l    a1,a0
  866.     move.l    a3,-(sp)
  867.     move.l    20(sp),a1
  868.     LEA.L    putc(pc),A2
  869.     MOVEA.L _AbsExecBase,A6
  870.     CALL    RawDoFmt
  871.     move.l    (sp)+,a3
  872.     MOVEA.L A3,A0
  873. 1$:    TST.B    (A0)+
  874.     bne    1$
  875.     SUBQ.L    #1,A0
  876.     SUBA.L    A3,A0
  877.     MOVE.L    A0,D0
  878.     MOVEM.L (sp)+,A2-A3/A6
  879.     RTS
  880.  
  881. strncpy:
  882.     MOVE.L    A0,D1
  883.     bra    1$
  884. 3$:    MOVE.B    (A1)+,(A0)+
  885.     beq    2$
  886. 1$:    SUBQ.L    #1,D0
  887.     bcc    3$
  888.     bra    4$
  889. 5$:    CLR.B    (A0)+
  890. 2$:    SUBQ.L    #1,D0
  891.     bcc    5$
  892. 4$:    MOVE.L    D1,D0
  893.     RTS
  894.  
  895. stricmp:
  896.     MOVEQ    #0,D0
  897.     MOVEQ    #0,D1
  898. 1$:    MOVE.B    (A0)+,D0
  899.     MOVE.B    (A1)+,D1
  900.     CMPI.B    #'a',D0
  901.     blt    2$
  902.     CMPI.B    #'z',D0
  903.     bgt    2$
  904.     SUBI.B    #32,D0
  905. 2$:    CMPI.B    #'a',D1
  906.     blt    3$
  907.     CMPI.B    #'z',D1
  908.     bgt    3$
  909.     SUBI.B    #32,D1
  910. 3$:    SUB.L    D1,D0
  911.     bne    4$
  912.     TST.B    D1
  913.     bne    1$
  914. 4$:    RTS
  915.  
  916. strcat: move.l    a0,d0
  917. 1$:    TST.B    (A0)+
  918.     bne    1$
  919.     SUBQ.L    #1,A0
  920. 2$:    MOVE.B    (A1)+,(A0)+
  921.     bne    2$
  922.     RTS
  923.  
  924. L11:        dc.w    0
  925. Version:    dc.b    "$VER: dir 37.51 (7.7.93 by as)",10,13,0
  926. DosName:    dc.b    "dos.library",0
  927. Template:    dc.b    "DIR,OPT/K,ALL/S,DIRS/S,FILES/S,INTER/S",0
  928. InteractionTemplate1:
  929.     dc.b    "E=ENTER/S,B=BACK/S,DEL=DELETE/S,Q=QUIT/S,C=COM/S,COMMAND",0
  930. InteractionTemplate2:
  931.     dc.b    "T=TYPE/S,B=BACK/S,DEL=DELETE/S,Q=QUIT/S,C=COM/S,COMMAND",0
  932. IgnoreOptTxt:    dc.b    " option ignored",10,0
  933. NoInfoTxt:    dc.b    "Could not get information for %s",10,0
  934. NoDirTxt:    dc.b    "%s is not a directory",10,0
  935. CircularDirTxt: dc.b    "Error, circular directory entry found",10,0
  936. DirHlTxt:    dc.b    "(dir)"
  937. HlTxt:        dc.b    " <hl>",0
  938. SlTxt:        dc.b    " <sl>",0
  939. DirTxt:     dc.b    "(dir)",0
  940. IncompleteTxt:    dc.b    "List incomplete -"
  941. SpcTxt:     dc.b    32,0
  942. DelTxt:     dc.b    "Deleted"
  943. LfTxt:        dc.b    10,0
  944. MetaFormat:    dc.b    "%%%lds%%s %%s",0
  945. MetaFormat2:    dc.b    "%%%lds%%s%%s",0
  946. MetaFormat3:    dc.b    "%%%lds%%-31s  %%s",10,0
  947. CmdQuest:    dc.b    10,"Command"
  948. QMarkTxt:    dc.b    " ? ",0
  949. InvalidAnswerTxt:
  950.         dc.b    "Invalid response - try again",10,0
  951.  
  952.     END
  953.